package com.lawyers.action;

import java.text.DecimalFormat;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.lawyers.common.UserVO;
import com.lawyers.form.LiquidadoraForm;

public class LiquidadoraAction extends Action {

	private static Logger logger = Logger.getLogger(LiquidadoraAction.class);

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		LiquidadoraForm liquidadoraForm = (LiquidadoraForm) form;
		String accion = liquidadoraForm.getAccion();
		
		UserVO user = (UserVO) request.getSession().getAttribute("USUARIO");

		if (user == null)
			return mapping.findForward("login");
		
		
		if(accion.equalsIgnoreCase("liquidar")){
			logger.info("Liquidando...");
			
			Double liquidacion = new Double("0");
			
			String remuneracionStr = request.getParameter("remuneracion");
			Double remuneracion = new Double("0");
			try{remuneracion = Double.parseDouble(remuneracionStr);}catch (Exception e) {}
			
			String ingresoStr = request.getParameter("fechaI");
			String egresoStr = request.getParameter("fechaE");
			String cantidadHorasStr = request.getParameter("cantidadHoras");
			String deStr = request.getParameter("de");
			String cantidadDiasStr = request.getParameter("cantidadDias");
			String indemnizacionDespidoStr = request.getParameter("indemnizacionDespido");
			String indemnizacionSustitutivaStr = request.getParameter("indemnizacionSustitutiva");
			String cobroHaberesStr = request.getParameter("cobroHaberes");
			String integracionDespidoStr = request.getParameter("integracionDespido");
			String vacacionesNoGozadasStr = request.getParameter("vacacionesNoGozadas");
			String sacStr = request.getParameter("sac");
			String sacVacacionesStr = request.getParameter("sacVacaciones");
			String sacDespidoStr = request.getParameter("sacVacaciones");
			Double diasIngreso = Double.parseDouble(ingresoStr.substring(6,10)) * 360 + Double.parseDouble(ingresoStr.substring(3,5)) * 30 + Double.parseDouble(ingresoStr.substring(0,2)) *1;
			Double diasEgreso = Double.parseDouble(egresoStr.substring(6,10)) * 360 + Double.parseDouble(egresoStr.substring(3,5)) * 30 + Double.parseDouble(egresoStr.substring(0,2)) *1;
			Double diasDiferencia = diasEgreso-diasIngreso;
			
			Double anios = (double) (diasDiferencia / 360);
			Double meses = (anios - Math.floor(anios)) * 12;
			Double dias = (meses - Math.floor(meses)) * 30;
			anios = Math.floor(anios);
			meses = Math.floor(meses);
			dias = Math.floor(dias);
			
			
			Double diasTrabajados = (Double.parseDouble(egresoStr.substring(3,5))-1) * 30 + Double.parseDouble(egresoStr.substring(0,2))*1;
			
			Double valorDia =  Double.parseDouble(remuneracionStr) / 30 ;
			Double valorHora =  valorDia / Double.parseDouble(cantidadHorasStr);
			
			Double iDespido = new Double("0");
			Double iSustitutiva = new Double("0");
			Double cHaberes = new Double("0");
			Double integDespido = new Double("0");
			Double vacasNoGozadas = new Double("0");
			Double totalSac = new Double("0");
			Double sacVacas = new Double("0");
			Double sacDespi = new Double("0");
			
			if("1".equalsIgnoreCase(indemnizacionDespidoStr)){
				if(meses > 3)
					iDespido += remuneracion * (anios+1);
				else
					iDespido += remuneracion * (anios);
			}
			liquidadoraForm.setIndemnizacionDespidoValue(iDespido.toString());
			
			if("1".equalsIgnoreCase(indemnizacionSustitutivaStr))
				iSustitutiva += remuneracion;
			
			liquidadoraForm.setIndemnizacionSustitutivaValue(iSustitutiva.toString());
			
			if("2".equalsIgnoreCase(cobroHaberesStr))
				cHaberes += valorDia * Double.parseDouble(egresoStr.substring(0,2)) ;
			
			if("1".equalsIgnoreCase(integracionDespidoStr))
				integDespido +=  valorDia * (30-Double.parseDouble(egresoStr.substring(0,2))) ;
			
			if("1".equalsIgnoreCase(vacacionesNoGozadasStr)){
				if(anios < 5){
					Double nuevo = diasTrabajados * 14 / 360;
					vacasNoGozadas += nuevo * valorDia;
				}if(anios >= 5 && anios < 10){
					Double nuevo = diasTrabajados * 21 / 360;
					vacasNoGozadas += nuevo * valorDia;
				}if(anios >= 10 && anios < 20){
					Double nuevo = diasTrabajados * 28 / 360;
					vacasNoGozadas += nuevo * valorDia;
				}if(anios >= 20){
					Double nuevo = diasTrabajados * 35 / 360;
					vacasNoGozadas += nuevo * valorDia;
				}
			}
			
			if("1".equalsIgnoreCase(sacStr)){
				totalSac += remuneracion / 2 / 180  * diasTrabajados;
			}else if ("2".equalsIgnoreCase(sacStr)){
				totalSac += remuneracion / 2 / 180  * (diasTrabajados-180);
			}else if("0".equalsIgnoreCase(sacStr)){
				totalSac += remuneracion / 360 * diasTrabajados;
			}
			
			if("1".equalsIgnoreCase(sacVacacionesStr)){
				sacVacas += vacasNoGozadas * 0.0833333 ;
			}
			
			if("1".equalsIgnoreCase(sacDespidoStr)){
				sacDespi += integDespido * 0.0833333;
			}
			
			DecimalFormat twoDForm = new DecimalFormat("#.##");
			
			liquidacion += iDespido + iSustitutiva + cHaberes + integDespido + vacasNoGozadas + totalSac + sacVacas + sacDespi;
			
			liquidadoraForm.setLiquidacion(twoDForm.format(liquidacion));
			liquidadoraForm.setIndemnizacionDespidoValue(twoDForm.format(iDespido));
			liquidadoraForm.setIndemnizacionSustitutivaValue(twoDForm.format(iSustitutiva));
			liquidadoraForm.setCobroHaberesValue(twoDForm.format(cHaberes));
			liquidadoraForm.setIntegracionDespidoValue(twoDForm.format(integDespido));
			liquidadoraForm.setVacacionesNoGozadasValue(twoDForm.format(vacasNoGozadas));
			liquidadoraForm.setSacValue(twoDForm.format(totalSac));
			liquidadoraForm.setSacVacacionesValue(twoDForm.format(sacVacas));
			liquidadoraForm.setSacDespidoValue(twoDForm.format(sacDespi));
			
			return mapping.findForward("liquidacion");
		}else if(accion.equalsIgnoreCase("volver")){
			return mapping.findForward("display");
		}else
			return mapping.findForward("display");
	}

}
